#include <stdio.h>
#include <stdlib.h>

// 问题：从n个损耗系数中选出最小的m个，并按从小到大的顺序输出
// 解题思路：通过排序将所有损耗系数按升序排列，取前m个即为最小的m个

// 比较函数，用于qsort排序（升序）
// 参数为两个void指针，转换为int指针后比较值的大小
int compare(const void *a, const void *b) {
    return *(int *)a - *(int *)b; // 正数表示a > b，用于qsort实现升序排序
}

int main() {
    int n, m;
    // 读取n（损耗系数的总数）和m（需要选出的最小损耗系数的数量）
    scanf("%d %d", &n, &m);
    
    // 动态分配数组空间，用于存储n个损耗系数
    // 动态分配适合处理n可能较大的情况，避免静态数组大小固定的限制
    int *loss_coefficients = (int *)malloc(n * sizeof(int));
    if (loss_coefficients == NULL) { // 检查内存分配是否成功
        printf("内存分配失败\n");
        return 1; // 分配失败时退出程序
    }
    
    // 读取n个损耗系数，存入数组
    for (int i = 0; i < n; i++) {
        scanf("%d", &loss_coefficients[i]);
    }
    
    // 对损耗系数数组进行升序排序
    // 排序后，数组前m个元素即为所有损耗系数中最小的m个
    qsort(loss_coefficients, n, sizeof(int), compare);
    
    // 输出前m个最小的损耗系数，每个系数单独占一行
    for (int i = 0; i < m; i++) {
        printf("%d\n", loss_coefficients[i]);
    }
    
    // 释放动态分配的内存，避免内存泄漏
    free(loss_coefficients);
    return 0;
}

// 算法说明：
// 1. 核心思路：利用排序将所有元素按升序排列，前m个元素自然是最小的m个
// 2. 排序方法：使用标准库qsort函数，时间复杂度为O(n log n)，效率较高
// 3. 适用性：对于n和m的常见规模（如n≤1e5），该方法简单且高效
// 4. 注意点：使用动态内存分配时需检查分配结果，并在使用后释放内存